package com.johann.multithread.runnable;
/*
*
* 生产者和消费者
* */

import static java.lang.Thread.sleep;

class Clerk{

    private  int productSum = 0;

   synchronized void produceProduct() {
        if (productSum< 20) {
            //先 生产产品
            productSum++;
            //再 打印输出 生产了第几个产品   （如果放在前面的话，会输出：生产了第0个产品！）
            System.out.println(Thread.currentThread().getName()+"生产了第"+productSum+"个产品");
            //唤醒生产者线程
            notify();
        }else{
            try {
                //如果商品生产超量了，就等待
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    synchronized void consumeProduct() {
        if(productSum>0){
            //先 打印输出 消费了第几个产品
            System.out.println(Thread.currentThread().getName()+"消费了第"+productSum+"个产品");
            //再 递减，准备进入下一次循环  （如果放在前面的话，会输出：消费了第0个产品！）
            productSum--;
            //唤醒生产者线程
            notify();
        }else {
            try {
                //如果消费过度了，就等待
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

// 生产者 实现 Runnable接口
class Producer implements Runnable{
    private  Clerk clerk;

    Producer(Clerk clerk){
        this.clerk=clerk;
    }

    @Override
    public void run() {
        while (true){
//            System.out.println("开始生产产品。。。。");
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clerk.produceProduct();
        }
    }
}

// 消费者 继承 Thread类
class Consumer extends Thread{

    private  Clerk clerk;

    Consumer(Clerk clerk){
        this.clerk=clerk;
    }

    @Override
    public void run() {
        while (true){
//            System.out.println("开始消费产品。。。。");
            try {
                sleep(1100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clerk.consumeProduct();
        }
    }
}


public class ProduceAndConsumer {

    public static void main(String[] args) {
        Clerk clerk = new Clerk();

        //关于生产者
        Producer producer = new Producer(clerk);

        //关于消费者
        Consumer consumer = new Consumer(clerk);

        //开启一个生产者线程
        Thread p1=new Thread(producer);
        p1.start();

        // 开启一个消费者线程
        Thread c1 = new Thread(consumer);
        c1.start();

    }
}



